#include"BlockQueue.hpp"
#include"Task.hpp"

#include<pthread.h>
#include<unistd.h>
#include<ctime>

int myAdd(int x ,int y)
{
    return x+y;
}

//消费者：从共享资源区中拿取数据，然后执行相应的任务
void*consumer(void*args)
{
    BlockQueue<Task>*bqeue = (BlockQueue<Task>*)args;
    while(true)
    {
        //获取任务，并完成任务
        Task t;
        bqeue->pop(&t);
        std::cout<<pthread_self()<<"consumer:"<<t.x_<<"+"<<t.y_<<"="<<t()<<std::endl;
    }
    return nullptr;
}

//生产者
void*productor(void*args)
{
    BlockQueue<Task>*beqeue = (BlockQueue<Task>*)args;
    while(true)
    {
        //制作任务、生产任务、最后输出消息
        int x = rand()%10+1;
        //直到一个没有被阻塞或者忽略的信号到达
        usleep(rand()%1000);
        int y = rand()%5+1;
        Task t(x,y,myAdd);

        beqeue->push(t);
        std::cout<<pthread_self<<"productor:"<<t.x_<<"+"<<t.y_<<std::endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    srand((uint64_t)time(nullptr)^getpid()^0x32457);
    BlockQueue<Task>*bqeue = new BlockQueue<Task>();

    pthread_t c[2],p[2];
    pthread_create(c,nullptr,consumer,bqeue);
    pthread_create(c+1,nullptr,consumer,bqeue);
    pthread_create(p,nullptr,productor,bqeue);
    pthread_create(p+1,nullptr,productor,bqeue);

    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);

    delete bqeue;

    return 0;
}